/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo;

import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;

/**
 *
 * @author HNCR
 */
public class DetalleFactura implements Serializable{
    private int cod_detalle;
    private Factura objFactura=new Factura();
    private Producto objProducto=new Producto();
    private int cantidad;
    private double precio_individual;
    private double sub_total;
    private int estado;
    private String est;
    private String salida;
    
    public DetalleFactura() {
    }

    public int getCod_detalle() {
        return cod_detalle;
    }

    public void setCod_detalle(int cod_detalle) {
        this.cod_detalle = cod_detalle;
    }

    public Factura getObjFactura() {
        return objFactura;
    }

    public void setObjFactura(Factura objFactura) {
        this.objFactura = objFactura;
    }

    public Producto getObjProducto() {
        return objProducto;
    }

    public void setObjProducto(Producto objProducto) {
        this.objProducto = objProducto;
    }
    
    public int getCantidad() {
        return cantidad;
    }

    public void setCantidad(int cantidad) {
        this.cantidad = cantidad;
    }

    public double getPrecio_individual() {
        return precio_individual;
    }

    public void setPrecio_individual(double precio_individual) {
        this.precio_individual = precio_individual;
    }

    public double getSub_total() {
        return sub_total;
    }

    public void setSub_total(double sub_total) {
        this.sub_total = sub_total;
    }

    public int getEstado() {
        return estado;
    }

    public void setEstado(int estado) {
        this.estado = estado;
    }

    public String getEst() {
        return est;
    }

    public void setEst(String est) {
        this.est = est;
    }

    public String getSalida() {
        return salida;
    }

    public void setSalida(String salida) {
        this.salida = salida;
    }
    
    //==========================================================================
    //-----registro
    public static boolean registrarDetalleFactura (DetalleFactura a)
    {
        boolean estado = false ;
        Connection conexion=null;
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall(" {CALL sp_detalle_factura_agregar "
                     +"(?,?,?,?)} ");
             st.setString(1,a.getObjFactura().getCod_factura());
             st.setString(2, a.getObjProducto().getCod_producto());
             st.setInt(3,a.getCantidad()); 
             st.registerOutParameter(4,java.sql.Types.INTEGER);
             st.execute();
             a.setCod_detalle(st.getInt(4));
             String val=""+a.getCod_detalle();
             if(val!=null)
             {
               estado=true;
                }
        st.close();
        conexion.close();
             
         } catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
         }
         
        return estado;  
        
    }
    
            
            public static boolean modificarDetalleFactura (DetalleFactura a)
    {
        boolean estado = false ;
        Connection conexion=null;
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall(" {CALL sp_detalle_factura_modificar "
                     +"(?,?,?,?)} ");
             st.setInt(1,a.getCod_detalle());
             st.setString(2, a.getObjProducto().getCod_producto());
             st.setInt(3,a.getCantidad()); 
             st.registerOutParameter(4,java.sql.Types.VARCHAR);
             st.execute();
             a.setSalida(st.getString(4));
             if(a.getSalida()!=null)
             {
               estado=true;
                }
        st.close();
        conexion.close();
             
         } catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
         }
         
        return estado;  
        
    }
         
            
            public static boolean cancelarFactura (Factura a)
    {
        boolean estado = false ;
        Connection conexion=null;
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall(" {CALL sp_factura_cancelar "
                     +"(?,?)} ");
             st.setString(1,a.getCod_factura());
             st.registerOutParameter(2,java.sql.Types.VARCHAR);
             st.execute();
             a.setSalida(st.getString(2));
             if(a.getSalida()!=null)
             {
               estado=true;
                }
        st.close();
        conexion.close();
             
         } catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
         }
         
        return estado;  
        
    }
            
    /*/---------buscar - listar---lista los detalles de una factura
    public static ArrayList<DetalleFactura> getListarDetallesFactura(DetalleFactura detfactura){
     ArrayList<DetalleFactura> arreglo=null;
     ResultSet rs=null;
        DetalleFactura obj=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{CALL sp_factura_buscar(?)}");
            st.setString(1, detfactura.getObjFactura().getObjCliente().getNombre());
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<DetalleFactura>();   
                do{
                        obj =new DetalleFactura();                        
                        obj.setCod_detalle(rs.getInt("cod_detalle"));
                        obj.getObjFactura().setCod_factura(rs.getString("cod_factura"));
                        obj.getObjProducto().setCod_producto(rs.getString("cod_producto"));
                        obj.getObjProducto().setDescripcion(rs.getString("descripcion"));
                        obj.setCantidad(rs.getInt("cantidad"));
                        obj.setPrecio_individual(rs.getDouble("precio_individual"));
                        obj.setSub_total(rs.getDouble("sub_total"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    } 
    */ 
    //---------buscar - listar---lista los detalles de una factura
    public static ArrayList<DetalleFactura> getListarDetallesFactura(DetalleFactura detfactura){
     ArrayList<DetalleFactura> arreglo=null;
     ResultSet rs=null;
        DetalleFactura obj=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{CALL sp_detalle_factura_listar(?)}");
            st.setString(1, detfactura.getObjFactura().getCod_factura());
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<DetalleFactura>();   
                do{
                        obj =new DetalleFactura();                        
                        obj.setCod_detalle(rs.getInt("cod_detalle"));
                        obj.getObjProducto().setCod_producto(rs.getString("cod_producto"));
                        obj.getObjProducto().setDescripcion(rs.getString("descripcion"));
                        obj.setCantidad(rs.getInt("cantidad"));
                        obj.setPrecio_individual(rs.getDouble("precio_individual"));
                        obj.setSub_total(rs.getDouble("sub_total"));
                        obj.setEstado(rs.getInt("estado"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    //-----registro
    public static boolean anularDetalleFactura (DetalleFactura a)
    {
        boolean estado = false ;
        Connection conexion=null;
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall(" {CALL sp_detalle_factura_cancelar"
                     +"(?,?)} ");
             st.setInt(1,a.getCod_detalle());
             st.registerOutParameter(2,java.sql.Types.VARCHAR);
             st.execute();
             a.setSalida(st.getString(2));
             
             if(a.getSalida() !=null)
             {
               estado=true;
                }
        st.close();
        conexion.close();
             
         } catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
         }
         
        return estado;  
        
    }
    
    public static String getCalcularTotal(Factura obj){
     String arreglo=null;
     ResultSet rs=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{CALL sp_factura_calcular_total(?)}");
            st.setString(1, obj.getCod_factura());
            rs = st.executeQuery();
            if (rs.next()){
                  
                do{                                             
                        arreglo=(rs.getString("total"));                        
                }while (rs.next());
            }
            if(arreglo==null){
                arreglo="0";
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    
     //-----registro
    public static boolean cerrarFactura (Factura a)
    {
        boolean estado = false ;
        Connection conexion=null;
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall(" {CALL sp_factura_cerrar"
                     +"(?,?)} ");
             st.setString(1,a.getCod_factura());
             st.registerOutParameter(2,java.sql.Types.VARCHAR);
             st.execute();
             a.setSalida(st.getString(2));
             
             if(a.getSalida() !=null)
             {
               estado=true;
                }
        st.close();
        conexion.close();
             
         } catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
         }
         
        return estado;  
        
    }
    
    //reportes
    public static ArrayList<DetalleFactura> getListarResporte2(DetalleFactura ing){
     ArrayList<DetalleFactura> arreglo=null;
    ResultSet rs=null;
        DetalleFactura obj=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{call sp_reportes_monto_recaudado_x_fecha_producto(?)}");
             st.setDate(1, new java.sql.Date(ing.getObjFactura().getFecha().getTime()));
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<DetalleFactura>();   
                do{
                      obj =new DetalleFactura();
                        obj.getObjProducto().setCod_producto(rs.getString("cod_producto"));
                        obj.getObjProducto().setDescripcion(rs.getString("descripcion"));
                        obj.setSub_total(rs.getDouble("monto"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    public static ArrayList<DetalleFactura> getListarResporte4(DetalleFactura ing){
     ArrayList<DetalleFactura> arreglo=null;
    ResultSet rs=null;
        DetalleFactura obj=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{call sp_reportes_productos_con_mayor_demanda(?,?)}");
             st.setDate(1, new java.sql.Date(ing.getObjFactura().getFecha().getTime()));
             st.setDate(2, new java.sql.Date(ing.getObjFactura().getFecha2().getTime()));
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<DetalleFactura>();   
                do{
                      obj =new DetalleFactura();
                      obj.getObjFactura().setFecha(rs.getDate("fecha"));
                        obj.getObjProducto().setCod_producto(rs.getString("cod_producto"));
                        obj.getObjProducto().setDescripcion(rs.getString("descripcion"));
                        obj.setCantidad(rs.getInt("cant"));
                        obj.setSub_total(rs.getDouble("monto"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    public static ArrayList<DetalleFactura> getListarResporte10(DetalleFactura ing){
    ArrayList<DetalleFactura> arreglo=null;
    ResultSet rs=null;
        DetalleFactura obj=null;
        Connection conexion = null;
        int mes;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{call sp_reportes_producto_mas_solicitado(?)}");
             st.setInt(1, ing.getObjFactura().getAnio());
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<DetalleFactura>();   
                do{
                      obj =new DetalleFactura();
                        mes=rs.getInt("mes");
                        switch (mes) {
                       case 1:
                           obj.getObjFactura().setMes("ENERO");
                           break;
                       case 2:
                           obj.getObjFactura().setMes("FEBRERO");
                           break;
                       case 3:
                           obj.getObjFactura().setMes("MARZO");
                           break;
                       case 4:
                           obj.getObjFactura().setMes("ABRIL");
                           break;
                       case 5:
                           obj.getObjFactura().setMes("MAYO");
                           break;
                       case 6:
                           obj.getObjFactura().setMes("JUNIO");
                           break;
                       case 7:
                           obj.getObjFactura().setMes("JULIO");
                           break;
                       case 8:
                           obj.getObjFactura().setMes("AGOSTO");
                           break;
                       case 9:
                           obj.getObjFactura().setMes("SETIEMBRE");
                           break;
                       case 10:
                           obj.getObjFactura().setMes("OCTUBRE");
                           break;
                       case 11:
                           obj.getObjFactura().setMes("NOVIEMBRE");
                           break;
                       case 12:
                           obj.getObjFactura().setMes("DICIEMBRE");
                           break;
                   }
                        obj.getObjProducto().setCod_producto(rs.getString("cod_producto"));
                        obj.getObjProducto().setDescripcion(rs.getString("descripcion"));
                        obj.getObjFactura().setCant(rs.getInt("cant"));
                        
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
}
